/*
 *  Cero Project - Copyright   2006 The Cero Developement Team 
 *  (Michael Laguerre, Camille Roux, Matthieu Segret, Mathieu Sivade) 
 * 
 *  This program is free software; you can redistribute it and/or modify it 
 *  under the terms of the GNU General Public License as published by the Free 
 *  Software Foundation; either version 2 of the License, or (at your option) 
 *  any later version.
 * 
 *  This program is distributed in the hope that it will be useful, but 
 *  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
 *  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 
 *  for more details.
 */

package org.ceroproject.ui.commandline;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.ceroproject.ui.commandline.commands.CommandsList;
import org.ceroproject.ui.commandline.commands.Help;
import org.ceroproject.ui.commandline.commands.Lister;
import org.ceroproject.ui.commandline.commands.Player;
import org.ceroproject.ui.commandline.commands.Start;
import org.ceroproject.ui.commandline.commands.Stop;


/**
 * Permet d'acc�der � la liste des commandes existantes. On doit sp�cifier
 * au listeur quelles sont les commandes qu'il doit recenser � travers la
 * fonction ajouterCommande
 * 
 * @author Mathieu Sivade
 */
public class CommandLister {
	/** Liste des commandes disponibles index�es selon leur nom */
	private HashMap<String, Command> commandesValides = new HashMap<String, Command>();

	/**
	 * Construit un ListeurCommandes
	 */
	public CommandLister() {
		ajouterCommande("list", Lister.getCommand());
		ajouterCommande("start", Start.getCommand());
		ajouterCommande("stop", Stop.getCommand());
		//ajouterCommande("see", See.getCommand());
		ajouterCommande("player", Player.getCommand());
		ajouterCommande("commands", CommandsList.getCommand());
		ajouterCommande("help", Help.getCommand());
	}

	/**
	 * Renvoie la commande dont le nom est 'nomcommande'
	 * 
	 * @param nomcommande
	 *            Nom de la commande � obtenir
	 * @return La commande dont le nom est 'nomcommande'
	 */
	public Command getCommandeCorrespondante(String nomcommande) {
		return commandesValides.get(nomcommande);
	}

	/**
	 * Liste tous les noms de commandes recens�es par ce listeur Complexit�
	 * d'ordre n (n : nombre de commandes)
	 * 
	 * @return La liste des commandes que le listeur connait
	 */
	public String getListeCommandes() {
		String result = "";
		Iterator<Map.Entry<String, Command>> it = commandesValides.entrySet()
				.iterator();
		Map.Entry<String, Command> curentry;
		while (it.hasNext()) {
			curentry = it.next();
			result = result + curentry.getKey() + " : " + curentry.getValue()
					+ "\n";
		}
		return result;
	}

	/**
	 * Ajoute la Commande 'commande' � la liste des commandes recens�es
	 * 
	 * @param alias
	 *            Alias de la commande
	 * @param commande
	 *            Commande � recenser
	 */
	public void ajouterCommande(String alias, Command commande) {
		commandesValides.put(alias, commande);
	}

	/**
	 * Ajoute la Commande 'commande' � la liste des commandes recens�es
	 * 
	 * @param commande
	 *            Commande � recenser
	 */
	public void ajouterCommande(Command commande) {
		commandesValides.put(commande.getNom(), commande);
	}

	/**
	 * Donne la map des commandes
	 * 
	 * @return Une map contenant pour chaque commande <noms de commandes,
	 *         commande>
	 */
	public Map<String, Command> getCommandes() {
		return new HashMap<String, Command>(commandesValides);
	}

	/**
	 * Enleve la commande de la liste
	 * 
	 * @param commande
	 *            la commande � enlever
	 */
	public void enleverCommande(Command commande) {
		commandesValides.remove(commande);
	}

}
